import { Injectable } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/compat/auth';
import { Router } from '@angular/router';
import { Observable, Subject } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class AuthService {

  constructor( private afAuth:AngularFireAuth, private router:Router) { }

  private emailEllenorizveVanE:boolean = false;
  private emailSubject:any= new Subject();


  //OBSERVABLE
  getIsLogged():Observable<any>{
    console.log("FELIRATKOZÁS.");

    //Megnézi a authState, hogy van-e USER az adatbázisban.
    this.afAuth.authState.subscribe(
        {
            next: (res:any):void =>  {
                                        //alert("authState_NEXT:"+JSON.stringify(res));

                                        if(res){

                                              if(res.emailVerified == false){
                                                  //window.alert("emailVerified_FALSE: "+res.emailVerified);
                                                  this.emailSubject.next(this.emailEllenorizveVanE);
                                              }
                                              else if (res.emailVerified == true){
                                                //window.alert("emailVerified_TRUE: "+res.emailVerified);
                                                this.emailSubject.next(this.emailEllenorizveVanE);
                                              }

                                        } else if (!res) {
                                          this.emailSubject.next(this.emailEllenorizveVanE);
                                        }

                                      }
        }


    );

    return this.emailSubject;
  }


  //2. Email ellenzörzés.
  emailEllenorzes(){
    return this.afAuth.onAuthStateChanged( 
                                            (res:any):void => {
                                                                //alert("EMAIL_ELLENŐRZÉS_ág:"+JSON.stringify(res));
                                                                
                                                                if(res){
                                                                    if (res.emailVerified==true) {
                                                                                                    //alert("E-mail_TRUE_ág:"+res.emailVerified);
                                                                                                    this.emailEllenorizveVanE=true;
                                                                                                    this.router.navigate(['lista']);
                                                                                                  }

                                                                    else if (res.emailVerified==false) {
                                                                                                          //alert("E-mail_FALSE_ág:"+res.emailVerified);
                                                                                                        }
                                                                } else if (!res) {
                                                                    //window.alert("RES=NULL");
                                                                    this.emailEllenorizveVanE=false;
                                                                    this.router.navigate(['list']);
                                                                }


                                                            }
                                        );
  }

  //1. LOGIN START.
  loginFn(email:string, passwd:string):void {
      this.afAuth.signInWithEmailAndPassword(email, passwd)

      //Ez fut ha van bejegyzés az adatbázisban a felhasználóról. Ha létezik a felhasználó ÉS a jelszó is jó.
      .then(
                (adat:any):void => {
                                      //window.alert("loginFn_THEN ága: "+JSON.stringify(adat));
                                  }
          )
      
      // Ha tehát van felahsználó a DB-ben, megnézem, hogy hitelesítette-e az emailjét. HA Igen, akkor emailVerified-et truera állítja.
      .then( ():void => {
                            //window.alert("Elindul_az_emailEllenorzes()");
                            this.emailEllenorzes();
                        }
          )

      //Ez fut ha NINCS az adatbázisban felhasználó. Ha NEM létezik a felhasználó vagy rossz a jelszó, vagy nincs hálózat.
      .catch( (err:any):void => {
                                    //alert("loginFn_CATCH ága: "+err.message);
                                    alert("Próbálkozz újra.");
                                }
            );
  }















  signUpFn(email:string, passwd:string){
    return this.afAuth.createUserWithEmailAndPassword(email, passwd)
            .then( ():void => {this.sendVerEmail();} )
            .catch( (err):void => {err.message} );
  }

  signOut(){
    return this.afAuth.signOut();
  }

  sendVerEmail(){
    return this.afAuth.currentUser.then(
                                          (u:any):void => {u.sendEmailVerification()}
                                      );
  }

}
